#include <stdio.h>
int main()
{
    int arr1[10];
    int arr2[10] = {0};
    int arr3[10] = {11, 22, 33, 44, 55};

    char arr4[10] = {0};
    int arr5[10] = {0};
    printf("%d %d\n", sizeof(arr4), sizeof(arr5));

    printf("%u %u\n", arr4, arr5);
    printf("%p %p\n", arr4, arr5);
    printf("%p %p\n", &arr4, &arr5);
    printf("===========================\n");

    // 数组名 1 代表数组 2代表数组的地址（数组的首元素的地址） （数组的首地址）
    // 数组名 在表达式里面会自动转化为 数组首地址
    // 只有在这三种情况下代表整个数组  1.定义 2.sizeof（arr4），3.&arr4

    printf("%u %p\n", arr5, arr5);
    printf("%u %p\n", arr5 + 1, arr5 + 1);
    printf("%u %p\n", arr5 + 2, arr5 + 2);
    printf("%u %p\n", arr5 + 3, arr5 + 3);

    // 数组的首地址(下标为0) + 1 = 数组的下标为1的元素的地址
    // 偏移量 = 步长(int 4) *数值n
    printf("===========================\n");
    printf("%u %p\n", arr4, arr4);
    printf("%u %p\n", arr4 + 1, arr4 + 1);
    printf("%u %p\n", arr4 + 2, arr4 + 2);
    printf("%u %p\n", arr4 + 3, arr4 + 3);

    // 偏移量 = 步长(char 1) *数值n
    // arr5数组 放在表达式 arr5 == &arr5  = &arr5[0]
    // 区别是 地址加法运算的时候 步长不一样(数组的地址步长是数组大小 首元素步长是元素大小)

    printf("===========================\n");
    printf("%p\n", arr3);
    printf("%p\n", &arr3[0]);
    printf("%p\n", &arr3[1]);
    printf("%p\n", &arr3[2]);

    printf("===========================\n");
    printf("%d\n", arr3[0]);
    printf("%d\n", arr3[1]);
    printf("%d\n", arr3[2]);

    printf("===========================\n");
    printf("%d\n", *(arr3));
    printf("%d\n", *(arr3 + 1));
    printf("%d\n", *(arr3 + 2));

    // arr[i] == *(arr +i)

    printf("===========================\n");
    printf("%u\n", arr3);
    printf("%u\n", &arr3);
    printf("%u\n", arr3 + 1); // arr3 + 1 步长是4 代表数组首地址
    printf("%u\n", &arr3 + 1);//&arr3 + 1 步长是40 代表整个数组

    return 0;
}